home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 22 / AACD 22.iso / AACD / Online / Apache / lib / php / XML / Parser.php
Encoding:
PHP Script  |  2001-03-06  |  2.9 KB  |  117 lines

  1. <?php
  2.  
  3. require_once "PEAR.php";
  4.  
  5. /*
  6.  
  7. Tests that need to be made:
  8. - error class
  9. - mixing character encodings
  10. - a test using all expat handlers
  11. - options (folding, output charset)
  12.  
  13.  */
  14.  
  15. class XML_Parser extends PEAR {
  16.     var $parser;
  17.     var $fp;
  18.     var $folding = true;
  19.  
  20.     function XML_Parser($charset = 'UTF-8') {
  21.     $this->PEAR();
  22.     $xp = @xml_parser_create($charset);
  23.     if (is_resource($xp)) {
  24.         $this->parser = $xp;
  25.         xml_parser_set_option($xp, XML_OPTION_CASE_FOLDING,
  26.                   $this->folding);
  27.         xml_set_object($xp, $this);
  28.         if (method_exists($this, "startHandler") ||
  29.         method_exists($this, "endHandler")) {
  30.         xml_set_element_handler($xp, "startHandler", "endHandler");
  31.         }
  32.         if (method_exists($this, "cdataHandler")) {
  33.         xml_set_character_data_handler($xp, "cdataHandler");
  34.         }
  35.         if (method_exists($this, "defaultHandler")) {
  36.         xml_set_default_handler($xp, "defaultHandler");
  37.         }
  38.         if (method_exists($this, "piHandler")) {
  39.         xml_set_processing_instruction_handler($xp, "piHandler");
  40.         }
  41.         if (method_exists($this, "unparsedHandler")) {
  42.         xml_set_unparsed_entity_decl_handler($xp, "unparsedHandler");
  43.         }
  44.         if (method_exists($this, "notationHandler")) {
  45.         xml_set_notation_decl_handler($xp, "notationHandler");
  46.         }
  47.         if (method_exists($this, "entityrefHandler")) {
  48.         xml_set_external_entity_ref_handler($xp, "entityrefHandler");
  49.         }
  50.     }
  51.     }
  52.  
  53.     function setInputFile($file) {
  54.     $fp = @fopen($file, "r");
  55.     if (is_resource($fp)) {
  56.         $this->fp = $fp;
  57.         return $fp;
  58.     }
  59.     return new XML_Parser_Error($php_errormsg);
  60.     }
  61.  
  62.     function setInput($fp) {
  63.     if (is_resource($fp)) {
  64.         $this->fp = $fp;
  65.         return true;
  66.     }
  67.     return new XML_Parser_Error("not a file resource");
  68.     }
  69.  
  70.     function parse() {
  71.     if (!is_resource($this->fp)) {
  72.         return new XML_Parser_Error("no input");
  73.     }
  74.     if (!is_resource($this->parser)) {
  75.         return new XML_Parser_Error("no parser");
  76.     }
  77.     while ($data = fread($this->fp, 2048)) {
  78.         $err = $this->parseString($data, feof($this->fp));
  79.         if (PEAR::isError($err)) {
  80.         return $err;
  81.         }
  82.     }
  83.     return true;
  84.     }
  85.  
  86.     function parseString($data, $eof = false) {
  87.     if (!is_resource($this->parser)) {
  88.         return new XML_Parser_Error("no parser");
  89.     }
  90.     if (!xml_parse($this->parser, $data, $eof)) {
  91.         $err = new XML_Parser_Error($this->parser);
  92.         xml_parser_free($this->parser);
  93.         return $err;
  94.     }
  95.     return true;
  96.     }
  97.  
  98. }
  99.  
  100. class XML_Parser_Error extends PEAR_Error {
  101.     var $error_message_prefix = 'XML_Parser: ';
  102.     function XML_Parser_Error($msgorparser = 'unknown error',
  103.                   $code = 0,
  104.                   $mode = PEAR_ERROR_RETURN,
  105.                   $level = E_USER_NOTICE) {
  106.     if (is_resource($msgorparser)) {
  107.         $msgorparser =
  108.         sprintf("%s at XML input line %d",
  109.             xml_error_string(xml_get_error_code($msgorparser)),
  110.             xml_get_current_line_number($msgorparser));
  111.     }
  112.     $this->PEAR_Error($msgorparser, $code, $mode, $level);
  113.     }
  114. }
  115.  
  116. ?>
  117.